package br.com.quiz.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;

import br.com.quiz.domain.Alternativa;
import br.com.quiz.domain.AlternativasQuestao;
import br.com.quiz.domain.Disciplina;
import br.com.quiz.domain.DisciplinaQuestao;
import br.com.quiz.domain.Professor;
import br.com.quiz.domain.Questao;
import br.com.quiz.factory.ConexaoFactory;
import br.com.quiz.util.HibernateUtil;

public abstract class QuestaoDAO{
	public static Integer salvar( Questao que ) {
		Session sessao = HibernateUtil.getSessionFactory().openSession();
		Transaction transacao = null;
		try {
			
			transacao = sessao.beginTransaction();
			Integer id=(Integer) sessao.save( que );
			transacao.commit();
			return id;

		} catch ( Exception e ) {
			transacao.rollback();
			e.printStackTrace();

		}
		return null;

	}

	public static void apagar(Questao q ) throws SQLException {
		Connection con = null;
		PreparedStatement ps;

		try {
			con = ConexaoFactory.conectar();
			String sql = "delete from questao where QUE_ID = ?";
			ps = con.prepareStatement( sql );
			ps.setInt( 1, q.getQueId() );
			ps.executeUpdate();
			System.out.println("Sucesso");
		} catch ( Exception e ) {
			con.rollback();
			System.out.println( "Erro: " + e.getMessage() );
		}

	}

	
	public static List< AlternativasQuestao > listarDisciplinasQuestao() {
		Session sessao = HibernateUtil.getSessionFactory().openSession();
		List< AlternativasQuestao > questoes = null;
		try {
			Query consulta = sessao.getNamedQuery( "AlternativasQuestao.listar" );
			questoes =(List< AlternativasQuestao >) consulta.list();
		} catch ( RuntimeException e ) {
			throw e;
		} finally {
			sessao.close();
		}

		return questoes;
	}
	
	public static List< Questao > listarQuestoes() {
		Session sessao = HibernateUtil.getSessionFactory().openSession();
		List< Questao > questoes = null;
		try {
			Query consulta = sessao.getNamedQuery( "Questao.listar" );
			questoes =(List< Questao >) consulta.list();
		} catch ( RuntimeException e ) {
			throw e;
		} finally {
			sessao.close();
		}

		return questoes;
	}
	
	public static Questao filtrarPorId( Integer idQuestao ) {
		Session sessao = HibernateUtil.getSessionFactory().openSession();
		Questao questao = null;
		try {
			Query consulta = sessao.getNamedQuery( "Questao.filtrarPorId" );
			consulta.setLong( "queId", idQuestao );
			questao = (Questao) consulta.uniqueResult();
		} catch ( RuntimeException e ) {
			throw e;
		} finally {
			sessao.close();
		}

		return questao;
	}
	
	public static List<Alternativa> filtrarAlternativasQuestao(Questao q){
		
		Connection con;
		PreparedStatement ps;

		try {
			con = ConexaoFactory.conectar();
			ArrayList< Alternativa > alternativas = new ArrayList();
			String sql = "select a.ALT_ID, a.ALT_DESCRICAO, a.ALT_CORRETA "
					+ "from alternativas a inner join alternativas_questao aq on aq.ALQ_ALT_ID=a.ALT_ID "
					+ "inner join questao q on q.QUE_ID=aq.ALQ_QUE_ID "
					+ "where q.QUE_ID= ?";
			ps = con.prepareStatement( sql );
			ps.setInt( 1, q.getQueId() );
			System.out.println( ps );
			ResultSet rs = ps.executeQuery();

			while ( rs.next() ) {
				Alternativa a = new Alternativa();
				a.setAltId( rs.getInt( "ALT_ID" ) );
				a.setAltDescricao( rs.getString( "ALT_DESCRICAO" )  );
				a.setAltCorreta( rs.getByte( "ALT_CORRETA") );
				alternativas.add( a );
				System.out.println( a );
			}
			System.out.println( "Listagem de alternativas obtidas com sucesso!" );
			return alternativas;
		} catch ( Exception e ) {
			System.out.println( "Falha ao listar alternativas " + e.getMessage() );
			e.printStackTrace();
		}
		return null;
	}
}
